/*
 https://leetcode.cn/submissions/detail/373390812/
 * 03. 无重复字符的最长子串
 * medium, 彭珵 2024.9.2
 * 滑动窗口
*/

class Solution {
public:
    int lengthOfLongestSubstring(string s) {
        unordered_map<char, int> charIndex; // 哈希表存储字符的最新索引
        int maxLength = 0; // 记录最长子串的长度
        int left = 0; // 左指针

        for (int right = 0; right < s.size(); right++) {
            char currentChar = s[right];

            // 如果字符已经在哈希表中且索引大于等于左指针
            if (charIndex.find(currentChar) != charIndex.end() && charIndex[currentChar] >= left) {
                // 更新左指针到重复字符的下一个位置
                left = charIndex[currentChar] + 1;
            }

            // 更新当前字符的索引
            charIndex[currentChar] = right;

            // 更新最大长度
            maxLength = max(maxLength, right - left + 1);
        }

        return maxLength; 
    }
};